def push(num, stack):
    """
    将新数字压入栈中，并尝试进行合并
    :param num: 要压入的新数字
    :param stack: 当前的栈
    :return:
    """
    total = num
    #从栈顶开始，尝试合并数字
    for i in range(len(stack) - 1, -1, -1):
        total -= stack[i];
        # 如果找到了可以合并的组合
        if total == 0:
            # 移除被合并的数字
            del stack[i:]
            # 将合并后的新数字压入栈中
            push(num * 2, stack)
            return
        # 如果和变成负数，说明无法合并，退出循环
        elif total < 0:
            break
    # 如果无法合并，直接将新数字压入栈中
    stack.append(num)

# 读取输入
nums = list(map(int, input().split()))
#初始化栈，将第一个数字压入
stack = [nums[0]]
# 处理剩余的数字
for i in range(1, len(nums)):
    push(nums[i], stack)
# 反转栈，使得输出从栈顶到栈底
stack.reverse();
# 输出结果
print(" ".join(map(str, stack)))